RDS MySQLの監査ログでrdsadminのログを出力しないように設定してみた
RDS MySQLで監査ログを出力する機会があったのですが、rdsadminユーザーのログが大量に出力されて邪魔だったので出力しないように設定してみました。
リソース作成
ブログの検証用のため以下の構成図の通りシングルAZで一台RDSを作成します。
作成には以下のCloudFormationテンプレートを使用しました。
CloudFormationテンプレート (ここをクリックしてください)
AWSTemplateFormatVersion: "2010-09-09" Description: RDS Stack Parameters: # ------------------------------------------------------------# # Parameters # ------------------------------------------------------------# RdsInstanceClass: Default: db.t2.micro Type: String RdsStorageSize: Default: 20 Type: Number RdsSubnet1: Type: AWS::EC2::Subnet::Id RdsSubnet2: Type: AWS::EC2::Subnet::Id RdsVpcId: Type: AWS::EC2::VPC::Id Resources: # ------------------------------------------------------------# # RDS # ------------------------------------------------------------# RdsSubnetGroup: Type: AWS::RDS::DBSubnetGroup Properties: DBSubnetGroupDescription: rds-subnet-group DBSubnetGroupName: rds-subnet-group SubnetIds: - !Ref RdsSubnet1 - !Ref RdsSubnet2 Tags: - Key: Name Value: rds-subnet-group RdsOptionGroup: Type: AWS::RDS::OptionGroup Properties: EngineName: mysql MajorEngineVersion: 8.0 OptionConfigurations: - OptionName: MARIADB_AUDIT_PLUGIN OptionGroupDescription: rds-option-group OptionGroupName: rds-option-group Rdssg: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: for RDS GroupName: rds-sg SecurityGroupEgress: - CidrIp: 0.0.0.0/0 FromPort: -1 IpProtocol: -1 ToPort: -1 SecurityGroupIngress: - FromPort: 3306 IpProtocol: tcp CidrIp: 0.0.0.0/0 ToPort: 3306 Tags: - Key: Name Value: rds-sg VpcId: !Ref RdsVpcId Password: Type: AWS::SecretsManager::Secret Properties: Description: RDS Password GenerateSecretString: GenerateStringKey: password SecretStringTemplate: '{"username": "root"}' ExcludeCharacters: '"@/\' Name: rdspassword Rds: Type: AWS::RDS::DBInstance Properties: AllocatedStorage: !Ref RdsStorageSize BackupRetentionPeriod: 0 DBInstanceClass: !Ref RdsInstanceClass DBInstanceIdentifier: rds DBSubnetGroupName: !Ref RdsSubnetGroup EnablePerformanceInsights: false Engine: mysql EngineVersion: 8.0.28 EnableCloudwatchLogsExports: - audit MasterUsername: !Sub '{{resolve:secretsmanager:${Password}::username}}' MasterUserPassword: !Sub '{{resolve:secretsmanager:${Password}::password}}' OptionGroupName: !Ref RdsOptionGroup Port: 3306 StorageType: gp2 Tags: - Key: Name Value: rds VPCSecurityGroups: - !Ref Rdssg
上記のCloudFormationテンプレートをデプロイするとRDS MySQLインスタンスが1台作成されます。
サブネットやVPCは既存のものを使用しているため、デプロイ前に作成を行っておいてください。
また、監査ログ出力が有効になった状態でデプロイされるので、リソース作成後にCloudWatch Logsを確認すると出力されていることが確認できます。
デプロイは以下のコマンドで行いました。
aws cloudformation create-stack --stack-name CloudFormationスタック名 --template-body file://CloudFormationテンプレートファイル名 --parameters ParameterKey=RdsSubnet1,ParameterValue=サブネットグループに使用するサブネットのID ParameterKey=RdsSubnet2,ParameterValue=サブネットグループに使用するサブネットのID ParameterKey=RdsVpcId,ParameterValue=セキュリティグループに使用するVPC ID
デプロイ完了後にCloudWatch Logsを確認するとrdsadminのログが大量に出力されていることが確認できます。
rdsadminのログを出力させないようにする
MySQL の MariaDB 監査プラグインのサポート
上記のドキュメントを読むと「SERVER_AUDIT_EXCL_USERS」というオプションにrdsadminを追加することで停止できると記載されているのでCloudFormationテンプレートに追加してみました。
オプショングループの部分を以下のように修正してください。
RdsOptionGroup: Type: AWS::RDS::OptionGroup Properties: EngineName: mysql MajorEngineVersion: 8.0 OptionConfigurations: - OptionName: MARIADB_AUDIT_PLUGIN OptionSettings: - Name: SERVER_AUDIT_EXCL_USERS Value: rdsadmin OptionGroupDescription: rds-option-group OptionGroupName: rds-option-group
CloudFormationテンプレート修正後以下のコマンドでデプロイを行います。
aws cloudformation deploy --stack-name CloudFormationスタック名 --template-body file://CloudFormationテンプレートファイル名
デプロイ後、CloudWatch Logsを確認するとrdsadminのログが停止していることが分かります。
私の場合は23:53にCloudFormationの更新が完了したので、それ以降に出ていないことを確認します。
確認にはCloudWatch Logs Insightを使用しました。
以下のクエリを実行します。
filter @message like /rdsadmin/ | fields @timestamp, @message
実行すると以下のようにグラフで確認ができます。
23:53以降もrdsadminのログが出力されていますが、これは接続と切断のログのようです。
さいごに
確認する必要のないログが大量に出力されていると邪魔になるので極力不要なものは出力しないようにするのがよいと思います。